home *** CD-ROM | disk | FTP | other *** search
/ Aminet 37 / Aminet 37 (2000)(Schatztruhe)[!][Jun 2000].iso / Aminet / dev / c / simplecalc.lha / SimpleCalc / Calc.gui.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-02-29  |  14.7 KB  |  478 lines

  1. /* ------------------------------------------------------------------
  2.  $VER: calc.gui.c 1.02 (29.02.2000)
  3.  
  4.  gadtools support & gui functions
  5.  
  6.  (C) Copyright 1999-2000 Matthew J Fletcher - All Rights Reserved.
  7.  amimjf@connectfree.co.uk - www.amimjf.connectfree.co.uk
  8.  ------------------------------------------------------------------ */
  9.  
  10. #include <exec/types.h>
  11. #include <intuition/intuition.h>
  12. #include <intuition/classes.h>
  13. #include <intuition/classusr.h>
  14. #include <intuition/imageclass.h>
  15. #include <intuition/gadgetclass.h>
  16. #include <libraries/gadtools.h>
  17. #include <graphics/displayinfo.h>
  18. #include <graphics/gfxbase.h>
  19. #include <clib/exec_protos.h>
  20. #include <clib/intuition_protos.h>
  21. #include <clib/gadtools_protos.h>
  22. #include <clib/graphics_protos.h>
  23. #include <clib/utility_protos.h>
  24. #include <string.h>
  25. #include <clib/diskfont_protos.h>
  26.  
  27. struct ExecBase *SysBase = NULL;
  28.  
  29. #include <pragmas/exec_pragmas.h>
  30. #include <pragmas/intuition_pragmas.h>
  31. #include <pragmas/gadtools_pragmas.h>
  32. #include <pragmas/graphics_pragmas.h>
  33. #include <pragmas/utility_pragmas.h>
  34.  
  35. #include "Calc.h"
  36.  
  37. struct Screen         *Scr = NULL;
  38. UBYTE                 *PubScreenName = NULL;
  39. APTR                   VisualInfo = NULL;
  40. struct Window         *CalcWnd = NULL;
  41. struct Window         *GraphWnd = NULL;
  42. struct Gadget         *CalcGList = NULL;
  43. struct Menu           *CalcMenus = NULL;
  44. struct IntuiMessage    CalcMsg;
  45. struct IntuiMessage    GraphMsg;
  46. struct Gadget         *CalcGadgets[27];
  47. UWORD                  CalcLeft = 0;
  48. UWORD                  CalcTop = 10;
  49. UWORD                  CalcWidth = 188;
  50. UWORD                  CalcHeight = 95;
  51. UWORD                  GraphLeft = 185;
  52. UWORD                  GraphTop = 10;
  53. UWORD                  GraphWidth = 274;
  54. UWORD                  GraphHeight = 105;
  55. UBYTE                 *CalcWdt = (UBYTE *)"Calculator v1.02";
  56. UBYTE                 *GraphWdt = (UBYTE *)"Graph Window";
  57. struct TextAttr       *Font, Attr;
  58. UWORD                  FontX, FontY;
  59. UWORD                  OffX, OffY;
  60. struct TextFont       *CalcFont = NULL;
  61. struct TextFont       *GraphFont = NULL;
  62.  
  63. UBYTE *Gadget2300Labels[] = {
  64.     (UBYTE *)"DEC",
  65.     (UBYTE *)"FLT",
  66.     (UBYTE *)"HEX",
  67.     (UBYTE *)"OCT",
  68.     (UBYTE *)"BIN",
  69.     (UBYTE *)"EXPO",
  70.     NULL };
  71.  
  72. struct NewMenu CalcNewMenu[] = {
  73.     NM_TITLE, (STRPTR)"Project", NULL, 0, NULL, NULL,
  74.     NM_ITEM, (STRPTR)"About", (STRPTR)"?", 0, 0L, (APTR)CalcItem0,
  75.     NM_ITEM, (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
  76.     NM_ITEM, (STRPTR)"Quit", (STRPTR)"Q", 0, 0L, (APTR)CalcItem1,
  77.     NM_TITLE, (STRPTR)"Edit", NULL, 0, NULL, NULL,
  78.     NM_ITEM, (STRPTR)"Cut", (STRPTR)"X", 0, 0L, (APTR)CalcItem2,
  79.     NM_ITEM, (STRPTR)"Copy", (STRPTR)"C", 0, 0L, (APTR)CalcItem3,
  80.     NM_ITEM, (STRPTR)"Paste", (STRPTR)"V", 0, 0L, (APTR)CalcItem4,
  81.     NM_ITEM, (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
  82.     NM_ITEM, (STRPTR)"Erase", (STRPTR)"D", 0, 0L, (APTR)CalcItem5,
  83.     NM_TITLE, (STRPTR)"Windows", NULL, 0, NULL, NULL,
  84.     NM_ITEM, (STRPTR)"Show Tape", (STRPTR)"T", CHECKIT|CHECKED, 0L, (APTR)CalcItem6,
  85.     NM_ITEM, (STRPTR)"Show Graphic", (STRPTR)"G", CHECKIT, 0L, (APTR)CalcItem7,
  86.     NM_END, NULL, NULL, 0, 0L, NULL };
  87.  
  88. UWORD CalcGTypes[] = {
  89.     BUTTON_KIND,
  90.     BUTTON_KIND,
  91.     BUTTON_KIND,
  92.     BUTTON_KIND,
  93.     BUTTON_KIND,
  94.     BUTTON_KIND,
  95.     BUTTON_KIND,
  96.     BUTTON_KIND,
  97.     BUTTON_KIND,
  98.     BUTTON_KIND,
  99.     BUTTON_KIND,
  100.     BUTTON_KIND,
  101.     BUTTON_KIND,
  102.     BUTTON_KIND,
  103.     BUTTON_KIND,
  104.     BUTTON_KIND,
  105.     BUTTON_KIND,
  106.     BUTTON_KIND,
  107.     BUTTON_KIND,
  108.     BUTTON_KIND,
  109.     BUTTON_KIND,
  110.     BUTTON_KIND,
  111.     BUTTON_KIND,
  112.     CYCLE_KIND,
  113.     TEXT_KIND,
  114.     TEXT_KIND,
  115.     TEXT_KIND
  116. };
  117.  
  118. struct NewGadget CalcNGad[] = {
  119.     4, 39, 33, 12, (UBYTE *)"1", NULL, GD_Gadget00, PLACETEXT_IN, NULL, (APTR)Gadget00Clicked,
  120.     41, 39, 33, 12, (UBYTE *)"2", NULL, GD_Gadget10, PLACETEXT_IN, NULL, (APTR)Gadget10Clicked,
  121.     78, 39, 33, 12, (UBYTE *)"3", NULL, GD_Gadget20, PLACETEXT_IN, NULL, (APTR)Gadget20Clicked,
  122.     4, 53, 33, 12, (UBYTE *)"4", NULL, GD_Gadget30, PLACETEXT_IN, NULL, (APTR)Gadget30Clicked,
  123.     41, 53, 33, 12, (UBYTE *)"5", NULL, GD_Gadget40, PLACETEXT_IN, NULL, (APTR)Gadget40Clicked,
  124.     78, 53, 33, 12, (UBYTE *)"6", NULL, GD_Gadget50, PLACETEXT_IN, NULL, (APTR)Gadget50Clicked,
  125.     4, 67, 33, 12, (UBYTE *)"7", NULL, GD_Gadget60, PLACETEXT_IN, NULL, (APTR)Gadget60Clicked,
  126.     41, 67, 33, 12, (UBYTE *)"8", NULL, GD_Gadget70, PLACETEXT_IN, NULL, (APTR)Gadget70Clicked,
  127.     78, 67, 33, 12, (UBYTE *)"9", NULL, GD_Gadget80, PLACETEXT_IN, NULL, (APTR)Gadget80Clicked,
  128.     4, 81, 33, 12, (UBYTE *)"0", NULL, GD_Gadget90, PLACETEXT_IN, NULL, (APTR)Gadget90Clicked,
  129.     4, 25, 33, 12, (UBYTE *)"MR", NULL, GD_Gadget100, PLACETEXT_IN, NULL, (APTR)Gadget100Clicked,
  130.     41, 25, 33, 12, (UBYTE *)"Min", NULL, GD_Gadget110, PLACETEXT_IN, NULL, (APTR)Gadget110Clicked,
  131.     78, 25, 33, 12, (UBYTE *)"CA", NULL, GD_Gadget120, PLACETEXT_IN, NULL, (APTR)Gadget120Clicked,
  132.     41, 81, 33, 12, (UBYTE *)".", NULL, GD_Gadget130, PLACETEXT_IN, NULL, (APTR)Gadget130Clicked,
  133.     78, 81, 33, 12, (UBYTE *)"<", NULL, GD_Gadget140, PLACETEXT_IN, NULL, (APTR)Gadget140Clicked,
  134.     115, 53, 33, 12, (UBYTE *)"*", NULL, GD_Gadget150, PLACETEXT_IN, NULL, (APTR)Gadget150Clicked,
  135.     152, 53, 33, 12, (UBYTE *)"/", NULL, GD_Gadget160, PLACETEXT_IN, NULL, (APTR)Gadget160Clicked,
  136.     115, 67, 33, 12, (UBYTE *)"+", NULL, GD_Gadget170, PLACETEXT_IN, NULL, (APTR)Gadget170Clicked,
  137.     152, 67, 33, 12, (UBYTE *)"-", NULL, GD_Gadget180, PLACETEXT_IN, NULL, (APTR)Gadget180Clicked,
  138.     115, 81, 33, 12, (UBYTE *)"-/+", NULL, GD_Gadget190, PLACETEXT_IN, NULL, (APTR)Gadget190Clicked,
  139.     152, 81, 33, 12, (UBYTE *)"=", NULL, GD_Gadget200, PLACETEXT_IN, NULL, (APTR)Gadget200Clicked,
  140.     115, 39, 33, 12, (UBYTE *)"(", NULL, GD_Gadget210, PLACETEXT_IN, NULL, (APTR)Gadget210Clicked,
  141.     152, 39, 33, 12, (UBYTE *)")", NULL, GD_Gadget220, PLACETEXT_IN, NULL, (APTR)Gadget220Clicked,
  142.     115, 25, 70, 12, NULL, NULL, GD_Gadget230, 0, NULL, (APTR)Gadget230Clicked,
  143.     6, 12, 180, 12, NULL, NULL, GD_Gadget240, 1, NULL, NULL,
  144.     6, 1, 130, 12, NULL, NULL, GD_Gadget250, 0, NULL, NULL,
  145.     133, 1, 51, 12, NULL, NULL, GD_Gadget260, 0, NULL, NULL
  146. };
  147.  
  148. ULONG CalcGTags[] = {
  149.     (TAG_DONE),
  150.     (TAG_DONE),
  151.     (TAG_DONE),
  152.     (TAG_DONE),
  153.     (TAG_DONE),
  154.     (TAG_DONE),
  155.     (TAG_DONE),
  156.     (TAG_DONE),
  157.     (TAG_DONE),
  158.     (TAG_DONE),
  159.     (TAG_DONE),
  160.     (TAG_DONE),
  161.     (TAG_DONE),
  162.     (TAG_DONE),
  163.     (TAG_DONE),
  164.     (TAG_DONE),
  165.     (TAG_DONE),
  166.     (TAG_DONE),
  167.     (TAG_DONE),
  168.     (TAG_DONE),
  169.     (TAG_DONE),
  170.     (TAG_DONE),
  171.     (TAG_DONE),
  172.     (GTCY_Labels), (ULONG)&Gadget2300Labels[ 0 ], (GTCY_Active), 1, (TAG_DONE),
  173.     (GTTX_Border), FALSE, (TAG_DONE),
  174.     (GTTX_Border), FALSE, (TAG_DONE),
  175.     (GTTX_Border), FALSE, (TAG_DONE)
  176. };
  177.  
  178. static UWORD ComputeX( UWORD value )
  179. {
  180.     return(( UWORD )((( FontX * value ) + 3 ) / 7 ));
  181. }
  182.  
  183. static UWORD ComputeY( UWORD value )
  184. {
  185.     return(( UWORD )((( FontY * value ) + 3 ) / 7 ));
  186. }
  187.  
  188. static void ComputeFont( UWORD width, UWORD height )
  189. {
  190.     Forbid();
  191.     Font = &Attr;
  192.     Font->ta_Name = (STRPTR)GfxBase->DefaultFont->tf_Message.mn_Node.ln_Name;
  193.     Font->ta_YSize = FontY = GfxBase->DefaultFont->tf_YSize;
  194.     FontX = GfxBase->DefaultFont->tf_XSize;
  195.     Permit();
  196.  
  197.     OffX = Scr->WBorLeft;
  198.     OffY = Scr->RastPort.TxHeight + Scr->WBorTop + 1;
  199.  
  200.     if ( width && height ) {
  201.         if (( ComputeX( width ) + OffX + Scr->WBorRight ) > Scr->Width )
  202.             goto UseTopaz;
  203.         if (( ComputeY( height ) + OffY + Scr->WBorBottom ) > Scr->Height )
  204.             goto UseTopaz;
  205.     }
  206.     return;
  207.  
  208. UseTopaz:
  209.     Font->ta_Name = (STRPTR)"topaz.font";
  210.     FontX = FontY = Font->ta_YSize = 8;
  211. }
  212.  
  213. int SetupScreen( void )
  214. {
  215.     if ( ! ( Scr = LockPubScreen( PubScreenName )))
  216.         return( 1L );
  217.  
  218.     ComputeFont( 0, 0 );
  219.  
  220.     if ( ! ( VisualInfo = GetVisualInfo( Scr, TAG_DONE )))
  221.         return( 2L );
  222.  
  223.     return( 0L );
  224. }
  225.  
  226. void CloseDownScreen( void )
  227. {
  228.     if ( VisualInfo ) {
  229.         FreeVisualInfo( VisualInfo );
  230.         VisualInfo = NULL;
  231.     }
  232.  
  233.     if ( Scr        ) {
  234.         UnlockPubScreen( NULL, Scr );
  235.         Scr = NULL;
  236.     }
  237. }
  238.  
  239. void CalcRender( void )
  240. {
  241.     ComputeFont( CalcWidth, CalcHeight );
  242.  
  243.     DrawBevelBox( CalcWnd->RPort, OffX + ComputeX( 3 ),
  244.                     OffY + ComputeY( 1 ),
  245.                     ComputeX( 182 ),
  246.                     ComputeY( 22 ),
  247.                     GT_VisualInfo, VisualInfo, GTBB_Recessed, TRUE, TAG_DONE );
  248. }
  249.  
  250. int HandleCalcIDCMP( void )
  251. {
  252.     struct IntuiMessage *m;
  253.     struct MenuItem     *n;
  254.     int         (*func)();
  255.     BOOL            running = TRUE;
  256.  
  257.     /* wait if no inputs (i.e de-selected) */
  258.     Wait( 1 << CalcWnd->UserPort->mp_SigBit );
  259.     while( m = GT_GetIMsg( CalcWnd->UserPort )) {
  260.  
  261.         CopyMem(( char * )m, ( char * )&CalcMsg, (long)sizeof( struct IntuiMessage ));
  262.  
  263.         GT_ReplyIMsg( m );
  264.  
  265.         switch ( CalcMsg.Class ) {
  266.  
  267.             case    IDCMP_REFRESHWINDOW:
  268.                 GT_BeginRefresh( CalcWnd );
  269.                 CalcRender();
  270.                 GT_EndRefresh( CalcWnd, TRUE );
  271.                 break;
  272.  
  273.             case    IDCMP_CLOSEWINDOW:
  274.                 running = CalcCloseWindow();
  275.                 break;
  276.  
  277.             case    IDCMP_VANILLAKEY:
  278.                 running = CalcVanillaKey();
  279.                 break;
  280.  
  281.             case    IDCMP_RAWKEY:
  282.                 running = CalcRawKey();
  283.                 break;
  284.  
  285.             case    IDCMP_GADGETUP:
  286.                 func = ( void * )(( struct Gadget * )CalcMsg.IAddress )->UserData;
  287.                 running = func();
  288.                 break;
  289.  
  290.             case    IDCMP_MENUPICK:
  291.                 while( CalcMsg.Code != MENUNULL ) {
  292.                     n = ItemAddress( CalcMenus, CalcMsg.Code );
  293.                     func = (void *)(GTMENUITEM_USERDATA( n ));
  294.                     running = func();
  295.                     CalcMsg.Code = n->NextSelect;
  296.                 }
  297.                 break;
  298.         }
  299.     }
  300.     return( running );
  301. }
  302.  
  303. int OpenCalcWindow( void )
  304. {
  305.     struct NewGadget    ng;
  306.     struct Gadget   *g;
  307.     UWORD       lc, tc;
  308.     UWORD       wleft = CalcLeft, wtop = CalcTop, ww, wh;
  309.  
  310.     ComputeFont( CalcWidth, CalcHeight );
  311.  
  312.     ww = ComputeX( CalcWidth );
  313.     wh = ComputeY( CalcHeight );
  314.  
  315.     if (( wleft + ww + OffX + Scr->WBorRight ) > Scr->Width ) wleft = Scr->Width - ww;
  316.     if (( wtop + wh + OffY + Scr->WBorBottom ) > Scr->Height ) wtop = Scr->Height - wh;
  317.  
  318.     if ( ! ( CalcFont = OpenDiskFont( Font )))
  319.         return( 5L );
  320.  
  321.     if ( ! ( g = CreateContext( &CalcGList )))
  322.         return( 1L );
  323.  
  324.     for( lc = 0, tc = 0; lc < Calc_CNT; lc++ ) {
  325.  
  326.         CopyMem((char * )&CalcNGad[ lc ], (char * )&ng, (long)sizeof( struct NewGadget ));
  327.  
  328.         ng.ng_VisualInfo = VisualInfo;
  329.         ng.ng_TextAttr   = Font;
  330.         ng.ng_LeftEdge   = OffX + ComputeX( ng.ng_LeftEdge );
  331.         ng.ng_TopEdge    = OffY + ComputeY( ng.ng_TopEdge );
  332.         ng.ng_Width      = ComputeX( ng.ng_Width );
  333.         ng.ng_Height     = ComputeY( ng.ng_Height);
  334.  
  335.         CalcGadgets[ lc ] = g = CreateGadgetA((ULONG)CalcGTypes[ lc ], g, &ng, ( struct TagItem * )&CalcGTags[ tc ] );
  336.  
  337.         while( CalcGTags[ tc ] ) tc += 2;
  338.         tc++;
  339.  
  340.         if ( NOT g )
  341.             return( 2L );
  342.     }
  343.  
  344.     if ( ! ( CalcMenus = CreateMenus( CalcNewMenu, GTMN_FrontPen, 0L, TAG_DONE )))
  345.         return( 3L );
  346.  
  347.     LayoutMenus( CalcMenus, VisualInfo, TAG_DONE );
  348.  
  349.     if ( ! ( CalcWnd = OpenWindowTags( NULL,
  350.                 WA_Left,    wleft,
  351.                 WA_Top,     wtop,
  352.                 WA_Width,   ww + OffX + Scr->WBorRight,
  353.                 WA_Height,  wh + OffY + Scr->WBorBottom,
  354.                 WA_IDCMP,   BUTTONIDCMP|CYCLEIDCMP|TEXTIDCMP|IDCMP_MENUPICK|IDCMP_CLOSEWINDOW|IDCMP_RAWKEY|IDCMP_VANILLAKEY|IDCMP_REFRESHWINDOW,
  355.                 WA_Flags,   WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_SMART_REFRESH|WFLG_ACTIVATE,
  356.                 WA_Gadgets, CalcGList,
  357.                 WA_Title,   CalcWdt,
  358.                 WA_ScreenTitle, "Calculator v1.02 - © Matthew J Fletcher 29/02/2000",
  359.                 WA_PubScreen,   Scr,
  360.                 TAG_DONE )))
  361.     return( 4L );
  362.  
  363.     SetMenuStrip( CalcWnd, CalcMenus );
  364.     GT_RefreshWindow( CalcWnd, NULL );
  365.  
  366.     CalcRender();
  367.  
  368.     return( 0L );
  369. }
  370.  
  371. void CloseCalcWindow( void )
  372. {
  373.     if ( CalcMenus      ) {
  374.         ClearMenuStrip( CalcWnd );
  375.         FreeMenus( CalcMenus );
  376.         CalcMenus = NULL;   }
  377.  
  378.     if ( CalcWnd        ) {
  379.         CloseWindow( CalcWnd );
  380.         CalcWnd = NULL;
  381.     }
  382.  
  383.     if ( CalcGList      ) {
  384.         FreeGadgets( CalcGList );
  385.         CalcGList = NULL;
  386.     }
  387.  
  388.     if ( CalcFont ) {
  389.         CloseFont( CalcFont );
  390.         CalcFont = NULL;
  391.     }
  392. }
  393.  
  394. int HandleGraphIDCMP( void )
  395. {
  396.     struct IntuiMessage *m;
  397.     int         (*func)();
  398.     BOOL            running = TRUE;
  399.  
  400.     /* wait if no inputs (i.e de-selected) */
  401.     Wait( 1 << GraphWnd->UserPort->mp_SigBit );
  402.     while( m = GT_GetIMsg( GraphWnd->UserPort )) {
  403.  
  404.         CopyMem(( char * )m, ( char * )&GraphMsg, (long)sizeof( struct IntuiMessage ));
  405.  
  406.         GT_ReplyIMsg( m );
  407.  
  408.         switch ( GraphMsg.Class ) {
  409.  
  410.             case    IDCMP_REFRESHWINDOW:
  411.                 GT_BeginRefresh( GraphWnd );
  412.                 GT_EndRefresh( GraphWnd, TRUE );
  413.                 break;
  414.  
  415.             case    IDCMP_CLOSEWINDOW:
  416.                 running = GraphCloseWindow();
  417.                 break;
  418.  
  419.                 break;
  420.         }
  421.     }
  422.     return( running );
  423. }
  424.  
  425. int OpenGraphWindow( void )
  426. {
  427.     struct NewGadget    ng;
  428.     struct Gadget   *g;
  429.     UWORD       lc, tc;
  430.     UWORD       wleft = GraphLeft, wtop = GraphTop, ww, wh;
  431.  
  432.     ComputeFont( GraphWidth, GraphHeight );
  433.  
  434.     ww = ComputeX( GraphWidth );
  435.     wh = ComputeY( GraphHeight );
  436.  
  437.     if (( wleft + ww + OffX + Scr->WBorRight ) > Scr->Width ) wleft = Scr->Width - ww;
  438.     if (( wtop + wh + OffY + Scr->WBorBottom ) > Scr->Height ) wtop = Scr->Height - wh;
  439.  
  440.     if ( ! ( GraphFont = OpenDiskFont( Font )))
  441.         return( 5L );
  442.  
  443.     if ( ! ( GraphWnd = OpenWindowTags( NULL,
  444.                 WA_Left,    wleft,
  445.                 WA_Top,     wtop,
  446.                 WA_Width,   ww + OffX + Scr->WBorRight,
  447.                 WA_Height,  wh + OffY + Scr->WBorBottom,
  448.                 WA_IDCMP,   IDCMP_INTUITICKS|IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW,
  449.                 WA_Flags,   WFLG_SIZEGADGET|WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_SMART_REFRESH|WFLG_ACTIVATE,
  450.                 WA_Title,   GraphWdt,
  451.                 WA_ScreenTitle, "Calculator v1.02 - © Matthew J Fletcher 29/02/2000",
  452.                 WA_PubScreen,   Scr,
  453.                 WA_MinWidth,    67,
  454.                 WA_MinHeight,   21,
  455.                 WA_MaxWidth,    640,
  456.                 WA_MaxHeight,   256,
  457.                 TAG_DONE )))
  458.     return( 4L );
  459.  
  460.     GT_RefreshWindow( GraphWnd, NULL );
  461.  
  462.     return( 0L );
  463. }
  464.  
  465. void CloseGraphWindow( void )
  466. {
  467.     if ( GraphWnd        ) {
  468.         CloseWindow( GraphWnd );
  469.         GraphWnd = NULL;
  470.     }
  471.  
  472.     if ( GraphFont ) {
  473.         CloseFont( GraphFont );
  474.         GraphFont = NULL;
  475.     }
  476. }
  477.  
  478.